/*
 * @lc app=leetcode id=125 lang=cpp
 *
 * [125] Valid Palindrome
 */
class Solution {
public:
    bool isPalindrome(string s) {

        int len = s.size();
        if (len <= 1) {
            return true;
        }

        int i = 0;
        int j = len-1;

        while (i < j) {

            while (i < j && !isValid(s[i])) {
                if (s[i] == '\\') {
                    i++;
                }
                i++;
            }
            while (i < j) {
                if (j > 0 && s[j-1] == '\\') {
                    j -= 2;
                } else if (!isValid(s[j])) {
                    j--;
                } else {
                    break;
                }
            }
            if (i < j) {
                if(toLower(s[i]) != toLower(s[j])) {
                    return false;
                }
                i++;
                j--;
            }
        }

        return true;
    }

    char toLower(char a) {
        if (a >= 'A' && a <= 'Z') {
            a += 'a' - 'A';
        }
        return a;
    }

    bool isValid(char a) {
        return (a >= 'A' && a <= 'Z') || 
            (a >= 'a' && a <= 'z') || 
            (a >= '0' && a <= '9');
    }
};

